<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 
    原型：js中所有对象都有一个__proto__属性，这个属性指向了对象的原型 
    对象的原型是怎么产生的？
    1.对象创建的时候，对象会自动获得一个__proto__属性（key），这个属性会指向构造函数（母亲）的prototype属性
    
    __proto__ 和 prototype的关系：
    __proto__ 是对象属性，prototype 是构造函数属性
    一个对象的__proto__属性，指向了其对应构造函数的prototype属性
     -->
</body>
<script>
    // js 继承
    function Person(name, age) {
        console.log(this);
        // Student的实例对象 --->zhangsan
        this.name = name;
        this.age = age;
    }
    // 所有的Person的实例对象（孩子）都可以调用say方法
    Person.prototype.say = function () {
        console.log('hello');
    }

    function Student(name, age, grade) {
        // 代码没有复用，代码冗余
        // this.name = name;
        // this.age = age;
        // 单独调用Person的时候 this指向window对象 并没有把name age 放在student对象中
        // Person(name, age)
        // this指向Person的实例对象对象
        // const p = new Person(name, age)


        // 最终方案： 借用构造函数继承
        // 此作用域中的this 指向Student的实例对象
        // Person.call(this, name, age)
        Person.apply(this, [name, age])
        this.grade = grade;
    }

    Student.prototype.study = function () {
        console.log('study');
    }

    const zhangsan = new Student('张三', 18, 1)
    console.log(zhangsan.name, zhangsan.age);
    // zhangsan.say()

</script>

</html>